;----------------------------------------------
; int slen(string message)
slen:
    push    ebx             ;保存-执行前的环境(因为此函数中只改变了ebx(eax是传进来的参数))
    mov     ebx,eax         ;都指向字符串首地址

; 指针后移，直至遇到 0(字符串的结尾)
nextchar:
    cmp     byte [eax],0
    jz      finished
    inc     eax
    jmp     nextchar

; 计算字符串的长度
finished:
    sub     eax,ebx
    pop     ebx             ;还原-执行前的环境
    ret
    
;----------------------------------------------
; void sprint(string message)
sprint:
    push    edx     ;因为要用到4个寄存器，所以先把这4个寄存器压栈-保存现场
    push    ecx
    push    ebx
    push    eax     ; 字符串的首地址
    call    slen    ; 计算字符串 ，传递eax(字符串首地址)进去

    ;print
    mov     edx,eax ;加载字符串长度(此时eax中，存储了字符串的长度)
    
    pop     eax     ;还原字符串首地址
    mov     ecx,eax ;加载-字符串首地址
    mov     ebx,1   ;输出到STDOUT
    mov     eax,4   ;sys_write
    int     80h

    pop     ebx     ;还原执行前的环境(还原刚刚用到的这几个寄存器)
    pop     ecx
    pop     edx
    ret
    
;----------------------------------------------
; void exit()
; exit(0)
quit:
    mov     ebx,0
    mov     eax,1
    int     80h
    ret